ユーザーアカウント認証(OAuth 2.0)でAPI v4を使いGoogle Analyticsのデータを取得する

ユーザーアカウント認証(OAuth 2.0)でAPI v4を使いGoogle Analyticsのデータを取得する

Clock Icon2021.03.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

データアナリティクス事業本部のkobayashiです。

以前Google AnalyticsのデータをPythonで扱う必要があったためGoogle Analytics APIのV4でデータを取得してみました。

この記事ではAPIを使う際のGoogle認証方法としてサービスアカウント認証を使っています。今回はサービスアカウントではなくユーザーアカウント認証(OAuth 2.0)を使ってみたいと思います。

環境

  • macOS Mojave
  • Python 3.7.4

Google Analytics APIでデータを取得する手順

Analytics APIを使ってGoogle Analyticsのデータを取得するには、

  • Analytics APIの設定を行う
  • クライアントライブラリをインストールする
  • Pythonでコードを記述し実行する

という手順になります。

Analytics API を使う準備

Analytics API V4を使うにはサービスアカウント認証の場合はまず以下の設定が必要でした。

  • GCP上に新規プロジェクト作成(または既存のプロジェクトがあればそれでもOK)
  • GCPプロジェクトに対してAPIを有効にする
  • GCP上でAPI用のサービスアカウントを作り鍵をJSON形式で作成する
  • サービスアカウントを作成した際にサービスアカウントIDをGoogleAnalitycsへユーザー登録する。

今回はユーザーアカウント認証で同じことを行いたいので手順としては以下になります。

  • GCP上に新規プロジェクト作成(または既存のプロジェクトがあればそれでもOK)
  • GCPプロジェクトに対してAPIを有効にする
  • GCP上でOAuth同意画面を設定する
  • GCP上でOAuth 2.0 クライアント IDを発行する
  • GoogleAnalyticsで認証を行うユーザーに権限を付与する。

前回の設定でAPIを有効にするまでは共通になるので、GCP上でOAuth同意画面を設定するから設定を行いたいと思います。

GCP上でOAuth同意画面を設定する

手順1)GCPにログインしAPIとサービスへ進み、OAuth 同意画面を押下する。

手順2)User Typeの選択画面で内部を選択して作成を押下する。

手順3)アプリ情報画面で必要情報を入力し保存して次へを押下して設定する。

  • アプリ名 :適当なアプリ名を入力
  • ユーザーサポートメール : 連絡の取れるメールアドレスを入力
  • ディベロッパーの連絡先情報 > メールアドレス : 連絡の取れるメールアドレスを入力

次の画面に進むとスコープの設定を行えますが、今回は対象外のため設定を行いません。

GCP上でOAuth 2.0 クライアント IDを作成後、認証情報をダウンロードする

手順1)APIとサービスへ進み、認証情報を押下し、認証情報画面に進み認証情報を作成 > OAuthクライアントIDを押下する。

手順2)OAuth クライアント ID の作成で必要情報を入力し作成を押下してOauthクライアントIDを作成する。

  • アプリケーションの種類 : デスクトップアプリを選択(ローカルマシーンで実行するため)
  • 名前 : 適当な名前を入力

OAuth クライアント ID が作成されるとクライアントクライアントシークレットが表示されるので控えておく。

Google Analyticsでユーザーに権限を与える

手順1)ユーザー管理の権限を持ったアカウントでGoogle Analyticsにログインし、メニューから管理を押下する。

手順2)アカウントユーザーの管理を押下する。

手順3)右上の+を選択し、ユーザーを追加を押下する。

手順4)ユーザー認証を行いたいユーザーのメールアドレスを入力し、権限はデータを取得するだけなので表示と分析にする。

これでユーザーアカウント認証でGoogle Analyticsでデータを取得できるようになりましたので設定は終わりです。

pydata-google-authのインストール

ユーザーアカウント認証(OAuth 2.0)を行う際にユーザー認証情報をキャッシュしてくれるモジュールをインストールします。このモジュールを使うことでスクリプトの実行時に初回のみOAuth同意画面で認証を行いその情報をキャッシュし、二回目以降はそのキャッシュを使ってスクリプトを実行することができます。

Welcome to pypdata-google-auth’s documentation! — pydata-google-auth 0.1.0 documentation

pipを使ってインストールできますので下記のコマンドを実行します。


pip install --upgrade pydata-google-auth

以上で準備が整ったので実際にデータを取得するコードを記述します。

Analytics APIを使ってデータを取得する

元となるコードは以前で使用したコードをベースにしています。


from googleapiclient.discovery import build
from pprint import pprint
import json
import pydata_google_auth

VIEW_ID = '<REPLACE_WITH_VIEW_ID>'


# ユーザーアカウントを使用した認証
def initialize_analytics_reporting():
    scoped_credentials = pydata_google_auth.get_user_credentials(
        [
            'https://www.googleapis.com/auth/cloud-platform',
            'https://www.googleapis.com/auth/analytics.readonly'
        ],
        client_id='{クライアントID}',
        client_secret='{クライアントシークレット}'
    )

    return build("analyticsreporting", "v4", credentials=scoped_credentials)

def get_report(analytics, next_page_token="0"):
    request_body = {
        "reportRequests": [{
            "viewId": VIEW_ID,
            "pageToken": next_page_token,
            "pageSize": 100,
            # "samplingLevel": "LARGE",
            "dateRanges": [{"startDate": "2021-02-01", "endDate": "2021-02-20"}],
            "metrics": [{"expression": "ga:pageviews"}],
            "dimensions": [{"name": "ga:pagePath"}, {"name": "ga:pageTitle"}],
            "orderBys": [{"fieldName": "ga:pageviews", "sortOrder": "DESCENDING"}]
        }]
    }
    return analytics.reports().batchGet(body=request_body).execute()


def print_response(response):
    rows = []
    for report in response.get("reports", []):
        column_header = report.get("columnHeader", {})
        dimension_headers = column_header.get("dimensions", [])
        metric_headers = column_header.get("metricHeader", {}).get("metricHeaderEntries", [])
        next_page_token = report.get('nextPageToken')

        for row in report.get("data", {}).get("rows", []):
            row_data = {}
            dimensions = row.get("dimensions", [])
            date_range_values = row.get("metrics", [])
            for header, dimension in zip(dimension_headers, dimensions):
                row_data[header] = dimension
            for i, values in enumerate(date_range_values):
                for metricHeader, value in zip(metric_headers, values.get("values")):
                    row_data[metricHeader.get("name")] = value
            rows.append(row_data)
    return rows, next_page_token


def print_all_response(analytics):
    next_page_token = "0"
    rows = []
    while next_page_token is not None:
        response = get_report(analytics, next_page_token)
        r, next_page_token = print_response(response)
        rows.extend(r)

    pprint(rows)


def main():
    analytics = initialize_analytics_reporting()
    print_all_response(analytics)


if __name__ == "__main__":
    main()


サービスアカウントで使用したコードからの主な変更ポイントとしては以下になります。

  • pydata_google_authのget_user_credentialsメソッドを使いユーザーアカウント認証を行う。
    • client_idパラメータにOAuth クライアント ID を作成した際に控えたクライアントを指定する
    • client_secretパラメータにOAuth クライアント ID を作成した際に控えたクライアントシークレットを指定する

このスクリプトを実行してみます。

ユーザーアカウント認証でスクリプトを実行する

手順1)スクリプトを実行するとOAuth同意画面用のアドレスが表示されるのでリンク先へ遷移する。

Please visit this URL to authorize this application: https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=xxxxxxxxxx-xxxxxxxxx.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fanalytics.readonly&state=xxxxx&prompt=consent&access_type=offline
Enter the authorization code: 

手順2)OAuth同意画面が表示されるので問題なければ許可を押下する。

手順3)Authコードが表示されるのでコピーする。

手順4)Authコードをスクリプト実行しているウィンドに貼り付け実行する。

Enter the authorization code: 4/1AY0e-g5fwhWxxxxxxxxxxxxxxxxxxxxxxxx

以上でGoogle Analyticsのデータが取得できます。

まとめ

Google AnalyticsのデータをAnalytics API V4を使い、ユーザーアカウント認証で取得してみました。特に難しい設定もなくデータが取得できました。実際に使う際にはOAuth同意画面のスコープを適切に設定して使いましょう。

最後まで読んで頂いてありがとうございました。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.